/*******************************************************************************
 * Copyright (c) 2012-2017 Codenvy, S.A.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *   Codenvy, S.A. - initial API and implementation
 *******************************************************************************/
package org.eclipse.che.ide.api.editor.texteditor;

import org.eclipse.che.ide.api.editor.EditorPartPresenter;
import org.eclipse.che.ide.api.editor.document.Document;
import org.eclipse.che.ide.api.editor.editorconfig.EditorUpdateAction;
import org.eclipse.che.ide.api.editor.editorconfig.TextEditorConfiguration;
import org.eclipse.che.ide.api.editor.keymap.KeyBinding;
import org.eclipse.che.ide.api.editor.position.PositionConverter;
import org.eclipse.che.ide.api.editor.text.LinearRange;
import org.eclipse.che.ide.api.editor.text.TextPosition;
import org.eclipse.che.ide.api.editor.text.TextRange;

import javax.validation.constraints.NotNull;

/**
 * Public view on the editor component.
 */
public interface TextEditor extends EditorPartPresenter {

    /**
     * Initializes this editor with the configuration and document provider.
     *
     * @param configuration
     *         the configuration of this editor.
     */
    void initialize(@NotNull TextEditorConfiguration configuration);

    /**
     * Returns the text editor configuration that was used for initialization.
     *
     * @return the text editor configuration
     */
    TextEditorConfiguration getConfiguration();

    /**
     * @return the text editor view implementation
     */
    @Override
    TextEditorPartView getView();

    /**
     * @return the text editor widget
     */
    EditorWidget getEditorWidget();

    /**
     * Add an editor-specific key binding.
     *
     * @param keyBinding
     *         the key binding
     */
    void addKeybinding(KeyBinding keyBinding);

    /**
     * Closes this text editor after optionally saving changes.
     *
     * @param save
     *         <code>true</code> if unsaved changed should be saved, and <code>false</code> if unsaved changed should be discarded
     */
    @Override
    void close(boolean save);

    /**
     * Returns whether the text in this text editor can be changed by the user.
     *
     * @return <code>true</code> if it can be edited, and <code>false</code> if it is read-only
     */
    boolean isEditable();

    /**
     * Abandons all modifications applied to this text editor's input element's textual presentation since the last save operation.
     */
    void doRevertToSaved();

    /**
     * Returns the document backing the text content.
     * @return the document
     */
    Document getDocument();

    /**
     * Return the content type of the editor content.<br>
     * Returns null if the type is not known yet.
     *
     * @return the content type
     */
    String getContentType();

    /**
     * Returns the selection range as a {@link TextRange} (i.e. two line, char objects: start en end).
     * @return the selection range
     */
    TextRange getSelectedTextRange();

    /**
     * Returns the selection range as a {@link LinearRange} (ie.e a start offset and a length).
     * @return the selection range
     */
    LinearRange getSelectedLinearRange();

    /**
     * Returns the cursor position as a {@link TextPosition} object (a line char position).
     * @return the cursor position
     */
    TextPosition getCursorPosition();

    /**
     * Returns the cursor model for the editor.
     * @return the cursor model
     */
    CursorModelWithHandler getCursorModel();

    /**
     * Returns a position converter relative to this editor (pixel coordinates <-> line char positions).
     *
     * @return a position converter
     */
    PositionConverter getPositionConverter();

    /**
     * Returns the cursor position as an offset from the start.
     * @return the cursor position
     */
    int getCursorOffset();

    /**
     * Returns the top visible line. Used to determine editor vertical scroll position
     * @return the top visible line
     */
    int getTopVisibleLine();

    /**
     * Set (scroll) top visible line
     * @param line
     *          the top line
     */
    void setTopLine(int line);

    /**
     * Displays a message to the user.
     * @param message message
     */
    void showMessage(String message);

    /**
     * Returns focus state of the text editor
     * @return <code>true</code> if the text editor is focused or <code>false</code> otherwise
     */
    boolean isFocused();

    /** Give the focus to the editor. */
    void setFocus();

    /** Calls all editor update actions for this editor. */
    void refreshEditor();

    /**
     *  Adds an editor update action for this editor.
     *  @param action the action to add
     */
    void addEditorUpdateAction(EditorUpdateAction action);
}
